import time
import requests
from datetime import datetime
from config.Peizhi import Fer

# 从配置文件中获取相关配置信息
fe = Fer()
# Django REST framework API 地址，用于推送故障信息
REST_API_URL = "http://222.134.245.144:17000/weizhang/VioModel/"

# 推送故障信息到 REST API 的函数
def send_fault_to_restapi(fault_info):
    """推送故障信息到REST API"""
    try:
        # 发送 POST 请求，将故障信息以 JSON 格式发送到指定的 API 地址
        response = requests.post(REST_API_URL, json=fault_info)
        if response.status_code == 201:
            # 若请求成功（状态码为 201），打印成功信息及故障描述
            print(f"故障推送成功：{fault_info['gu_zhang_miao_shu']}")
        else:
            # 若请求失败，打印失败信息，包含状态码和响应内容
            print(f"故障推送失败，状态码：{response.status_code}，响应：{response.text}")
    except requests.exceptions.RequestException as e:
        # 若请求过程中发生异常，打印异常信息
        print(f"推送故障信息失败：{str(e)}")

# 获取泵名称的函数
def bengdata():
    # 保持原有逻辑不变
    # 定义 API 请求的 URL
    url = "http://222.134.245.144:17000/chuanganqi/FieldConfigModel/"
    try:
        # 发送 GET 请求
        response = requests.get(url)
        # 检查响应状态码，若不是 200 则抛出异常
        response.raise_for_status()
        # 将响应内容转换为 JSON 格式
        data = response.json()
        # 获取结果列表
        results = data.get("results", [])
        # 用于存储泵名称的列表
        pump_names = []
        # 遍历每个结果
        for result in results:
            # 获取主副泵的数据
            zhufubeng_data = result.get("zhufubeng", [])
            # 遍历每个主副泵信息
            for pump_info in zhufubeng_data:
                # 获取泵的类型
                pump_type = pump_info["pump"]
                # 获取泵的名称
                pump_name = pump_info["name"]
                if pump_type == "主泵":
                    # 若为主泵，将名称和类型组合添加到列表中
                    pump_names.append(f"{pump_name}-主泵")
                elif pump_type == "副泵":
                    # 若为副泵，将名称和类型组合添加到列表中
                    pump_names.append(f"{pump_name}-副泵")
        # 若泵名称列表长度大于等于 2，返回前两个元素，否则返回默认值
        return pump_names[:2] if len(pump_names) >= 2 else ["未知主泵", "未知副泵"]
    except Exception as e:
        # 若发生异常，打印错误信息并返回默认值
        print(f"获取泵名称失败：{e}")
        return ["未定义主泵", "未定义副泵"]

# 从 API 获取数据的函数
def get_data_from_api():
    # 保持原有逻辑不变
    # 定义 API 请求的 URL
    api_url = "http://222.134.245.144:17000/chuanganqi/BopPanelModel/"
    try:
        # 发送 GET 请求
        response = requests.get(api_url)
        # 检查响应状态码，若不是 200 则抛出异常
        response.raise_for_status()
        # 将响应内容转换为 JSON 格式并返回
        return response.json()
    except requests.RequestException as e:
        # 若发生请求异常，打印错误信息并返回 None
        print(f"获取数据失败：{e}")
        return None

# 获取详细数据的函数
def get_data2():
    # 保持原有逻辑不变
    # 调用 get_data_from_api 函数获取数据
    data = get_data_from_api()
    if not data:
        # 若数据为空，返回空字典
        return {}
    # 获取结果列表
    results = data.get("results", [])
    if not results:
        # 若结果列表为空，返回空字典
        return {}
    # 获取最新的结果
    latest_result = results[0]
    try:
        # 获取储能器压力值并转换为整数
        accumulator_pressure = int(latest_result.get("chu_neng_qi_ya_li", 0))
    except (ValueError, TypeError):
        # 若转换失败，返回空字典
        return {}
    # 获取主泵数据
    beng1 = latest_result.get("dian_beng_1", {})
    # 获取副泵数据
    beng2 = latest_result.get("dian_beng_2", {})
    # 获取主泵状态
    device_id1 = beng1.get("deng", False)
    # 获取副泵状态
    device_id2 = beng2.get("deng", False)
    # 调用 bengdata 函数获取主副泵名称
    zhu, fu = bengdata()

    # 补充泵名称到数据中
    pump_data = {
        "pump_main_name": zhu,
        "pump_f_name": fu,
        "pump_main": device_id1,
        "pump_f": device_id2,
        "accumulator_pressure": accumulator_pressure,
        "pump1_flow": 10,
        "pump2_flow": 10,
        "normal_flow_2800": fe.normal_flow_2800 or 0,
        "normal2_flow_2800": fe.normal2_flow_2800 or 0,
        "normal_flow_2600": fe.normal_flow_2600 or 0,
        "normal2_flow_2600": fe.normal2_flow_2600 or 0
    }
    # 打印储能器压力值、主副泵名称及状态
    print(f"储能器压力值: {accumulator_pressure}, 主泵: {zhu}, 状态: {device_id1}, 副泵: {fu}, 状态: {device_id2}")
    return pump_data

# 检查泵凡尔泄漏的函数
def check_pump_valve_leakage():
    # 调用 get_data2 函数获取数据
    data = get_data2()
    if not data:
        # 若数据为空，直接返回
        return

    # 获取主泵名称
    pump_main_name = data["pump_main_name"]
    # 获取副泵名称
    pump_f_name = data["pump_f_name"]
    # 获取储能器压力值
    accumulator_pressure = data["accumulator_pressure"]
    # 获取主泵状态
    pump1_status = data["pump_main"]
    # 获取副泵状态
    pump2_status = data["pump_f"]
    # 获取压力≥2800psi 时主泵的正常流量
    normal_flow_2800 = data["normal_flow_2800"]
    # 获取压力≥2600psi 时主泵的正常流量
    normal_flow_2600 = data["normal_flow_2600"]
    # 获取压力≥2600psi 时副泵的正常流量
    normal2_flow_2600 = data["normal2_flow_2600"]
    # 记录开始时间
    start_time = time.time()
    # 初始化主泵累计流量
    total_flow_1 = 0
    # 初始化副泵累计流量
    total_flow_2 = 0

    # 场景1：主泵单独运行（压力≥2800psi）
    if accumulator_pressure >= 2800 and pump1_status and not pump2_status:
        print("开始监测主泵30秒流量...")
        while time.time() - start_time < 30:
            try:
                # 再次获取数据
                data = get_data2()
                if not data:
                    # 若数据为空，跳出循环
                    break
                # 累加主泵流量
                total_flow_1 += data["pump1_flow"]
                # 暂停 1 秒
                time.sleep(1)
            except Exception as e:
                # 若发生异常，打印错误信息并跳出循环
                print(f"数据采集异常：{e}")
                break
        # 触发故障条件
        if total_flow_1 < normal_flow_2800:
            print(f"{pump_main_name} 泵凡尔泄漏")
            # 调用内部函数推送泄漏故障信息
            _push_leakage_fault(
                pump_name=pump_main_name,
                actual_flow=total_flow_1,
                normal_flow=normal_flow_2800,
                pressure=accumulator_pressure
            )

    # 场景2：主泵+副泵同时运行（压力≥2600psi）
    elif accumulator_pressure >= 2600 and pump1_status and pump2_status:
        print("开始监测主泵和副泵30秒流量...")
        while time.time() - start_time < 30:
            try:
                # 再次获取数据
                data = get_data2()
                if not data:
                    # 若数据为空，跳出循环
                    break
                # 累加主泵流量
                total_flow_1 += data["pump1_flow"]
                # 累加副泵流量
                total_flow_2 += data["pump2_flow"]
                # 暂停 1 秒
                time.sleep(1)
            except Exception as e:
                # 若发生异常，打印错误信息并跳出循环
                print(f"数据采集异常：{e}")
                break
        # 检查主泵故障
        if total_flow_1 < normal_flow_2600:
            print(f"{pump_main_name} 泵凡尔泄漏")
            # 调用内部函数推送泄漏故障信息
            _push_leakage_fault(
                pump_name=pump_main_name,
                actual_flow=total_flow_1,
                normal_flow=normal_flow_2600,
                pressure=accumulator_pressure
            )
        # 检查副泵故障
        if total_flow_2 < normal2_flow_2600:
            print(f"{pump_f_name} 泵凡尔泄漏")
            # 调用内部函数推送泄漏故障信息
            _push_leakage_fault(
                pump_name=pump_f_name,
                actual_flow=total_flow_2,
                normal_flow=normal2_flow_2600,
                pressure=accumulator_pressure,
                is_primary=False
            )

# 内部函数：构造并推送泄漏故障
def _push_leakage_fault(pump_name, actual_flow, normal_flow, pressure, is_primary=True):
    """内部函数：构造并推送泄漏故障"""
    # 根据是否为主泵确定故障类型
    fault_type = "主泵" if is_primary else "副泵"
    # 构造故障信息字典
    fault_info = {
        "gu_zhang_ming_cheng": f"{fault_type}泵凡尔泄漏",
        "she_bei_ming_cheng": pump_name,
        "she_bei_qu_yu": "泵组",
        "gu_zhang_shi_jian": datetime.now().strftime("%Y-%m-%dT%H:%M:%S"),
        "gu_zhang_lei_xing": "泄漏",
        "shi_ji_zhi": actual_flow,
        "gao_jing_zhi": normal_flow,
        "gu_zhang_miao_shu": (
            f"储能器压力{pressure}psi时，{pump_name} 30s累计流量{actual_flow} "
            f"< 正常流量{normal_flow}"
        ),
        "chu_li_zhuang_tai": "未处理"
    }
    # 调用 send_fault_to_restapi 函数推送故障信息
    send_fault_to_restapi(fault_info)

# 执行检测
check_pump_valve_leakage()